import tkinter as tk

import socket

class globalVal:#全局变量区
	useronline_table=[]#连线用户表，凡是与本机联系的用户都在此登记
	receivesocket=[]#用于接收来自外界信息的套接字
	sendsocket=[]#用于对外发送信息的套接字
	mainkey="E1A90FB64DDE12AE"#整体密钥，这是迪菲-赫尔曼密钥协商的基础

class onlineuser:#连线用户类
	def __init__(self,userIP,sendport_l=-1,receiveport_l=-1,sendport_r=-1,receiveport_r=6544):
		self.userIP=userIP#对方IP
		self.sendport_l=sendport_l#本地用哪个端口向其发送数据
		self.receiveport_l=receiveport_l#本地用哪个端口接收来自该用户的数据
		self.sendport_r=sendport_r#对方用哪个端口向本地发数据
		self.receiveport_r=receiveport_r#对方用哪个端口接收来自本地的数据
		self.senden=False#能否向该用户发送数据
		self.receiveen=False#能否从该用户接收数据
		self.sendsocket=None#用于向该用户发送数据的socket对象
		self.receivesocket=None#用于接收来自该用户数据的本地的socket对象
		self.sessionkey="E1A90FB64DDE12AE"#会话密钥

def puterror_win(text):#用于报错的小窗口，text为报错内容
	errorwin=tk.Toplevel()
	errorwin.title("程序错误")
	errorwin.geometry("250x100")
	prompt=tk.Label(errorwin,text=text)
	buttonKnow=tk.Button(errorwin,text="确定",command=lambda:errorwin.destroy())
	prompt.pack()
	buttonKnow.pack()

def putuseronline_table():#用于显示有哪些用户和本机联系
	tablewin=tk.Tk()
	tablewin.title("与本机建立连接的用户")
	tablewin.geometry("700x600")
	prompt1=tk.Label(tablewin,text="端口号-1表示不可用或未知")
	userText=tk.Text(tablewin,width="80",height="40")
	userText.place(x=10,y=25)
	prompt1.place(x=10,y=5)
	userText.config(state="normal")
	userText.insert("0.0","用户IP（或主机名）\t发送端口号\t接收端口号\t能否发送\n")
	for x in globalVal.useronline_table:#这里的发送和接收端口号都是以本机的为观察角度的
		userText.insert(tk.END,x.userIP+"\t\t\t"+str(x.sendport_l)+"\t"+str(x.receiveport_l)+"\t"+str(x.senden)+"\n")
	userText.config(state="disabled")#为了防止乱改这里设为不可编辑


def useronline_tablecheck(IP,port,sendorreceive):#寻找连线用户
	if sendorreceive=='1':#1表示从本机发送，0表示到本机接收
		for x in globalVal.useronline_table:
			if x.userIP==IP and x.sendport_l==port:
				return x
	else:
		for x in globalVal.useronline_table:
			if x.userIP==IP and x.receiveport_l==port:
				return x
	return None#如果找到则返回用户对象，否则返回空

def useronline_tabledelete(IP,port,sendorreceive):#从连线用户表中删除某一用户
	if sendorreceive=='1':
		user=useronline_tablecheck(IP,port,1)#找到目标用户本身
		if user==None:
			return -1
		user.senden=False#设置为不可发送
		user.sendport_l=-1#自身发送的端口失效
		user.receiveport_r=-1#对方接收的端口失效
	else:
		user=useronline_tablecheck(IP,port,0)#找到目标用户本身
		if user==None:
				return -1
		user.receiveen=False#设置为不可接收
		user.receiveport_l=-1#自身接收和对方发送的端口失效
		user.sendport_r=-1
	return 0#0表示成功删除，-1表示该用户本来就不存在